﻿using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using LumenWorks;

namespace Barockoco_Chat_Client
{
    public partial class DataMorph : Form
    {
        public string fileadress;

        public DataMorph(string incFileadress)
        {
            InitializeComponent();
            fileadress = incFileadress;
        }

        private void DataMorph_Load(object sender, EventArgs e)
        {
            showfile(fileadress);
            labelDateVonTest.Text = "Es wird nach Ergebnissen zwischen \n\"" + dateTimePickerDateVon.Value.ToString("dd.MM.yy") + "\"\n und\n\"" + dateTimePickerDateBis.Value.ToString("dd.MM.yy") + "\"\n gesucht";
        }

        public void showfile(string file)
        {
            try
            {
                using (StreamReader sr = new StreamReader(file))
                {
                    String line;
                    while ((line = sr.ReadLine()) != null)
                    {
                        textBoxCSV.AppendText(line + "\r\n");
                    }
                }
            }
            catch (Exception e)
            {
                // Let the user know what went wrong.
                Console.WriteLine("Datei konnte nicht gelesen werden:\n");
                Console.WriteLine(e.Message);
            }
        }

        private void buttonSaveFile_Click(object sender, EventArgs e)
        {
            if (File.Exists(fileadress + ".temp"))
            {
                try { File.Delete(fileadress + ".temp"); 
                StreamWriter sw = new StreamWriter(fileadress);
                sw.WriteLine(textBoxCSV.Text);
                sw.Close();
                }
                catch (Exception edelete) { MessageBox.Show(edelete.Message); }
            }
            else
            {
                try
                {
                    StreamWriter sw = new StreamWriter(fileadress);
                    sw.WriteLine(textBoxCSV.Text);
                    sw.Close();
                }
                catch (Exception esave) { MessageBox.Show(esave.Message); }
            }
        }

        private void buttonGoMorph_Click(object sender, EventArgs e)
        {
            //first lets save a copy to temp
            StreamWriter swtemp = new StreamWriter(fileadress+".temp");
            swtemp.WriteLine(textBoxCSV.Text);
            swtemp.Close();
            //clear out the textbox
            textBoxCSV.Text = "";

            //next lets find and replace
            try
            {
                using (StreamReader sr = new StreamReader(fileadress + ".temp"))
                {
                    String line;
                    while ((line = sr.ReadLine()) != null)
                    {
                        while(checksearchtext(textBoxMorphSuche.Text,line))
                        {
                            //MessageBox.Show(line);
                            line = replace(line, textBoxMorphSuche.Text, textBoxMorphErsetzen.Text);
                        }
                        textBoxCSV.AppendText(line + "\r\n");
                    }
                }
                StreamWriter swsave = new StreamWriter(textBoxCSV.Text);
                swsave.WriteLine(fileadress + ".temp");
                swsave.Close();
            }
            catch (Exception e2)
            {
                // Let the user know what went wrong.
                Console.WriteLine("Text konnte nicht ersetzt werden:\n");
                Console.WriteLine(e2.Message);
            }
        }

        private bool checksearchtext(string searchtext, string text)
        {
            if (text.Contains(searchtext))
                return true;
            else 
                return false;
        }

        private int compareDate(DateTime text) 
        {
            DateTime thisdate = DateTime.Today;
            if (text.CompareTo(thisdate) < 0) return -1;
            else if (text.CompareTo(thisdate) == 0) return 0;
            else if (text.CompareTo(thisdate) > 0) return 1;
            else { MessageBox.Show("Das Datum konnte nicht mit dem heutigen Tag verglichen werden - bitte prüfen Sie die Datumseinstellungen Ihres Computers"); return 0; }
        }

        private int compareDate(string searchdate, DateTime text) 
        {
            DateTime vergleich;            
            vergleich = new DateTime();
            vergleich = DateTime.ParseExact(searchdate, "dd.MM.yyyy", null);
            if (text.CompareTo(vergleich) < 0) return -1;
            else if (text.CompareTo(vergleich) == 0) return 0;
            else if (text.CompareTo(vergleich) > 0) return 1;
            else { MessageBox.Show("Das Datum konnte nicht mit dem heutigen Tag verglichen werden - bitte prüfen Sie die Datumseinstellungen Ihres Computers"); return 0; }
        }

        public string replace(string errString, string search, string replace)
        {
            string correctString = errString.Replace(search, replace);
            return correctString;
        }
        //public string finddate(string line, string searchdate, string replacedate)
        //{
        //    int firstindex = line.IndexOf(';');
        //    string correctString ="";// Replace(searchdate, replacedate);
        //    return correctString;
        //}
        private void changetest(object sender, EventArgs e)
        {
            labelDateVonTest.Text = "Es wird nach Ergebnissen zwischen \n\"" + dateTimePickerDateVon.Value.ToString("dd.MM.yy") + "\"\n und\n\"" + dateTimePickerDateBis.Value.ToString("dd.MM.yy") + "\"\n gesucht";
        }

        private void buttonGoDatum_Click(object sender, EventArgs e) 
        {
            if (!(textBoxCSV.Text.Contains(dateTimePickerDateVon.Value.ToString("dd.MM.yy"))))
            {
                MessageBox.Show("Das \"Von\" Datum ist in der ausgewählten Datei nicht vorhanden - Das Ergebnis wird nicht korrekt sein!");
                return;
            }
            else if (!(textBoxCSV.Text.Contains(dateTimePickerDateBis.Value.ToString("dd.MM.yy"))))
            {
                MessageBox.Show("Das \"Bis\" Datum ist in der ausgewählten Datei nicht vorhanden - Das Ergebnis wird nicht korrekt sein!");
                return;
            }
            //first lets save a copy to temp
            StreamWriter swtemp = new StreamWriter(fileadress + ".temp");
            swtemp.WriteLine(textBoxCSV.Text);
            swtemp.Close();
            //clear out the textbox
            textBoxCSV.Text = "";
            int doLineLoop = 0;
            //int testcounter = 1;

            //next lets find and replace
            try
            {
                using (StreamReader sr = new StreamReader(fileadress + ".temp"))
                {
                    String line;
                    while ((line = sr.ReadLine()) != null)//arbeite alle zeilen der reihe nach ab
                    {
                        
                        
                        
                        
                        //MessageBox.Show(testcounter.ToString());
                        //testcounter++;
                        //erste zeile enhält header - wird immer geschrieben
                        if (doLineLoop == 0 && textBoxCSV.Text == "" && checksearchtext("Buchung", line) == true)
                        {
                            textBoxCSV.AppendText(line + "\r\n");
                            doLineLoop = 1;
                        }
                        //else { MessageBox.Show("Es ist beim Datum aussortieren zu einem Fehler gekommen, bitte überprüfen Sie den Export."); }
                        //ab zweiter zeile check nach datum
                        else if (doLineLoop==1 && (checksearchtext(dateTimePickerDateVon.Value.ToString("dd.MM.yy"), line) == false))//wenn eine zeile nicht das ab-datum enthält
                        {
                            //nichts schreiben
                        }
                        else if(doLineLoop == 1 && checksearchtext(dateTimePickerDateVon.Value.ToString("dd.MM.yy"), line) == true) //wenn die zeile das ab datum enthält
                        {
                            textBoxCSV.AppendText(line + "\r\n");
                            doLineLoop = 2;
                            if (dateTimePickerDateVon.Value == dateTimePickerDateBis.Value) doLineLoop = 3;
                        }
                        else if (doLineLoop == 2 && checksearchtext(dateTimePickerDateVon.Value.ToString("dd.MM.yy"), line) == true) //wenn die zeile WIEDER das ab datum enthält
                        {
                            textBoxCSV.AppendText(line + "\r\n");
                            doLineLoop = 2;
                            if (dateTimePickerDateVon.Value == dateTimePickerDateBis.Value) doLineLoop = 3;
                        }
                        else if (doLineLoop == 2 && checksearchtext(dateTimePickerDateVon.Value.ToString("dd.MM.yy"), line) == false) 
                        {//wenn die zeile nicht mehr das ab datum enthält aber das erste bis
                            textBoxCSV.AppendText(line + "\r\n");
                            if (checksearchtext(dateTimePickerDateBis.Value.ToString("dd.MM.yy"), line) == true)doLineLoop = 3;
                            if (dateTimePickerDateVon.Value == dateTimePickerDateBis.Value) doLineLoop = 3;
                        }
                        else if (doLineLoop == 3 && checksearchtext(dateTimePickerDateBis.Value.ToString("dd.MM.yy"), line) == true)//wenn die zeile das bis enthält
                        {
                            textBoxCSV.AppendText(line + "\r\n");
                            doLineLoop = 3;
                        }
                        else if (doLineLoop == 3 && checksearchtext(dateTimePickerDateBis.Value.ToString("dd.MM.yy"), line) == false)//wenn die zeile das bis nicht mehr enthält
                        {
                            //textBoxCSV.AppendText(line + "\r\n");
                            doLineLoop = 4;
                        }
                        else 
                        {
                            //sobald das bis-datum nicht mehr gefunden wird, höre auf!
                            MessageBox.Show("Ich bin fertig. Es wurde eine Sicherungskopie Ihres Exports gezogen. \n Die Originaldatei ist unversehrt. \n Zum Speichern Wählen Sie Speichern aus dem Menü Datei.");
                            break;
                        }
                        //textBoxCSV.AppendText(line + "\r\n");
                    }
                }
                StreamWriter swsave = new StreamWriter(textBoxCSV.Text);
                swsave.WriteLine(fileadress + ".temp");
                swsave.Close();
            }
            catch (Exception e2)
            {
                // Let the user know what went wrong.
                Console.WriteLine("Datum konnte nicht geändert werden:\n");
                Console.WriteLine(e2.Message);
            }
        }

        private void buttonQuickToday_Click(object sender, EventArgs e)
        {
            dateTimePickerDateVon.Value = DateTime.Today;
            dateTimePickerDateBis.Value = DateTime.Today;
            textBoxMorphSuche.Text = ";4020;";
            textBoxMorphErsetzen.Text = ";8400;";
            try
            {
                this.buttonGoMorph_Click(buttonQuickToday, e);
                this.buttonGoDatum_Click(buttonQuickToday, e);
            }
            catch(Exception eQuick) 
            {
                MessageBox.Show("Die Schnellfunktion konnte nicht ausgeführt werden:\n"+eQuick);
            }
        }
    }
}
